package cgeo.geocaching.network;
import static org.assertj.core.api.Java6Assertions.assertThat;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
public class ParametersTest extends TestCase {
static final List<Character> UNRESERVED = new ArrayList<>();
static {
// unreserved characters: ALPHA / DIGIT / "-" / "." / "_" / "~"
for (int i = 65; i <= 90; i++) {
UNRESERVED.add((char) i); // uppercase
UNRESERVED.add((char) (i + 32)); // lowercase
}
for (int i = 0; i < 10; i++) {
UNRESERVED.add(Character.forDigit(i, 10));
}
UNRESERVED.add('-');
UNRESERVED.add('.');
UNRESERVED.add('_');
UNRESERVED.add('~');
}
public static void testException() {
try {
final Parameters params = new Parameters("aaa", "AAA", "bbb");
params.clear(); // this will never be invoked, but suppresses warnings about unused objects
fail("Exception not raised");
} catch (final InvalidParameterException e) {
// Ok
}
try {
final Parameters params = new Parameters("aaa", "AAA");
params.put("bbb", "BBB", "ccc");
fail("Exception not raised");
} catch (final InvalidParameterException e) {
// Ok
}
}
public static void testMultipleValues() {
final Parameters params = new Parameters("aaa", "AAA", "bbb", "BBB");
params.put("ccc", "CCC", "ddd", "DDD");
assertThat(params.toString()).isEqualTo("aaa=AAA&bbb=BBB&ccc=CCC&ddd=DDD");
}
public static void testSort() {
final Parameters params = new Parameters();
params.put("aaa", "AAA");
params.put("ccc", "CCC");
params.put("bbb", "BBB");
assertThat(params.toString()).isEqualTo("aaa=AAA&ccc=CCC&bbb=BBB");
params.sort();
assertThat(params.toString()).isEqualTo("aaa=AAA&bbb=BBB&ccc=CCC");
}
public static void testToString() {
final Parameters params = new Parameters();
params.put("name", "foo&bar");
params.put("type", "moving");
assertThat(params.toString()).isEqualTo("name=foo%26bar&type=moving");
}
public static void testUnreservedCharactersMustNotBeEncoded() {
for (final Character c : UNRESERVED) {
final String charAsString = String.valueOf(c);
assertEquals("wrong OAuth encoding for " + c, charAsString, Parameters.percentEncode(charAsString));
}
}
public static void testOtherCharactersMustBeEncoded() {
for (int i = 32; i < 127; i++) {
final Character c = (char) i;
if (!UNRESERVED.contains(c)) {
final String charAsString = String.valueOf(c);
final String encoded = Parameters.percentEncode(charAsString);
assertThat(charAsString).overridingErrorMessage("Character '" + charAsString + "' not encoded").isNotEqualTo(encoded);
assertThat(encoded).startsWith("%");
}
}
}
public static void testAsterisk() {
assertThat("*".equals(Parameters.percentEncode("*"))).isFalse();
}
public static void testPercentEncoding() {
final Parameters params = new Parameters("oauth_callback", "callback://www.cgeo.org/");
assertThat(params.toString()).isEqualTo("oauth_callback=callback://www.cgeo.org/");
params.usePercentEncoding();
assertThat(params.toString()).isEqualTo("oauth_callback=callback%3A%2F%2Fwww.cgeo.org%2F");
}
}